#include <Wire.h>
#include <vl53l5cx_class.h>
#include "NanoEdgeAI.h"
#include "knowledge.h"

// Capteur ToF
VL53L5CX sensor_vl53l5cx(&Wire, A3);

// Buffers NanoEdge AI
float neai_buffer[64];       // Entrée : 64 distances
float output_buffer[4];      // Sortie : probabilités des 4 classes
uint16_t neai_class = 0;     // Classe détectée

// Variables du jeu
const char* class_names[] = {"Rien", "Pierre", "Feuille", "Ciseaux"};
unsigned long lastDetectionTime = 0;
int playerScore = 0;
int computerScore = 0;

void setup() {
  Serial.begin(115200);
  delay(2000);
  
  Serial.println("=== Pierre-Feuille-Ciseaux avec NanoEdge AI ===");
  
  // Initialiser NanoEdge AI
  neai_classification_init(knowledge);
  Serial.println("NanoEdge AI initialisé");
  
  // Initialiser le capteur ToF
  Wire.begin();
  Wire.setClock(400000);
  
  sensor_vl53l5cx.begin();
  sensor_vl53l5cx.init();
  sensor_vl53l5cx.vl53l5cx_set_resolution(VL53L5CX_RESOLUTION_8X8);
  sensor_vl53l5cx.vl53l5cx_set_ranging_frequency_hz(15);
  sensor_vl53l5cx.vl53l5cx_start_ranging();
  
  Serial.println("Capteur ToF prêt");
  Serial.println("Montrez votre signe devant le capteur !");
  Serial.println();
  
  randomSeed(analogRead(A0));
}

void loop() {
  VL53L5CX_ResultsData Results;
  uint8_t NewDataReady = 0;
  
  sensor_vl53l5cx.vl53l5cx_check_data_ready(&NewDataReady);
  
  if (NewDataReady) {
    sensor_vl53l5cx.vl53l5cx_get_ranging_data(&Results);
    
    // Remplir le buffer NanoEdge AI
    for (int i = 0; i < 64; i++) {
      neai_buffer[i] = (float)Results.distance_mm[i];
    }
    
    // Classification
    neai_classification(neai_buffer, output_buffer, &neai_class);
    
    // Ignorer la classe "Rien" (classe 1)
    if (neai_class > 1 && millis() - lastDetectionTime > 3000) {
      lastDetectionTime = millis();
      
      int playerChoice = neai_class; // 2=Pierre, 3=Feuille, 4=Ciseaux
      int computerChoice = random(2, 5); // Choix aléatoire
      
      Serial.println("========================================");
      Serial.print("Vous : ");
      Serial.print(class_names[playerChoice - 1]);
      Serial.print("  |  Ordinateur : ");
      Serial.println(class_names[computerChoice - 1]);
      
      // Logique du jeu
      if (playerChoice == computerChoice) {
        Serial.println(">>> ÉGALITÉ !");
      } 
      else if ((playerChoice == 2 && computerChoice == 4) ||  // Pierre bat Ciseaux
               (playerChoice == 3 && computerChoice == 2) ||  // Feuille bat Pierre
               (playerChoice == 4 && computerChoice == 3)) {  // Ciseaux bat Feuille
        Serial.println(">>> VOUS GAGNEZ !");
        playerScore++;
      } 
      else {
        Serial.println(">>> VOUS PERDEZ !");
        computerScore++;
      }
      
      Serial.print("Score - Vous : ");
      Serial.print(playerScore);
      Serial.print("  |  Ordinateur : ");
      Serial.println(computerScore);
      Serial.println("========================================");
      Serial.println();
    }
  }
}